﻿using System;
using System.Linq;
using System.ComponentModel;
using System.Windows.Forms;
using OwnZTec.LojaDelivery.Data;

namespace OwnZTec.LojaDelivery.UI.WinForms
{
    public partial class FrmGrupoProduto : OwnZForm
    {
        #region -- Membros e Construtores -------------------------------------------------------------------------------------------------
        public FrmGruposProdutos Pai
        {
            get;
            set;
        }

        public bool Edicao
        {
            get;
            set;
        }

        private bool _alterado;

        public tbGrupoProduto GrupoProduto
        {
            get;
            set;
        }

        public FrmGrupoProduto()
        {
            InitializeComponent();
            this.ConfigurarFormFilho();
        }

        private void FrmGrupoProduto_Load(object sender, EventArgs e)
        {
            Carregar();
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Eventos ----------------------------------------------------------------------------------------------------------------
        private void txtNome_Validating(object sender, CancelEventArgs e)
        {
            if (txtNome.Text.EhNuloOuVazio())
            {
                erpErro.SetError(txtNome, "Informar o nome do grupo de produto");
                e.Cancel = true;
                return;
            }

            erpErro.SetError(txtNome, "");
        }

        private void txtNome_TextChanged(object sender, EventArgs e)
        {
            _alterado = true;
        }

        private void txtvalor_TextChanged(object sender, EventArgs e)
        {
            _alterado = true;
        }

        private void txtvalor_ValueChanging(object sender, CancelEventArgs e)
        {
            _alterado = true;
        }

        private void txtvalor_Validating(object sender, CancelEventArgs e)
        {
            e.Cancel = ValidarValor();
        }

        private void cmdSalvar_Click(object sender, EventArgs e)
        {
            if (ValidarValor())
                return;

            Salvar();
            Close();
        }

        private void cmdSair_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void FrmGrupoProduto_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!_alterado)
                return;

            var res = Contexto.MainForm.ExibirMensagemSairSemSalvar();

            if (res != DialogResult.Yes)
            {
                e.Cancel = true;
                return;
            }

            Dispose();
        }

        private void cmdCopiarPreco_Click(object sender, EventArgs e)
        {
            var res = Contexto.MainForm.ExibirMensagem("Deseja aplicar o preço deste grupo de produto a todos produtos deste grupo?",
                                                       MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (res == DialogResult.No)
                return;

            Contexto.Db.tbProdutoes.Where(p => p.idGrupo == GrupoProduto.idGrupo).ToList().ForEach(p =>
            {
                p.valPrecoProduto = 0;
            });

            Contexto.Db.SaveChanges();
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Metodos ----------------------------------------------------------------------------------------------------------------
        private void Salvar()
        {
            GrupoProduto.desNomeGrupo = txtNome.Text;
            GrupoProduto.valPrecoPadrao = decimal.Parse(txtvalor.Value.ToString());

            if (!Edicao)
                Contexto.Db.tbGrupoProdutoes.AddObject(GrupoProduto);

            Contexto.Db.SaveChanges();

            Edicao = true;

            _alterado = false;

            Pai.AtualizarGrid();
        }

        private void Carregar()
        {
            if (Edicao)
            {
                txtNome.Text = GrupoProduto.desNomeGrupo;
                txtvalor.Text = GrupoProduto.valPrecoPadrao.ToString();

                var qtdProds = Contexto.Db.tbProdutoes.Where(p => p.idGrupo == GrupoProduto.idGrupo).Count();

                cmdCopiarPreco.Enabled = qtdProds != 0;
            }

            else
            {
                GrupoProduto = new tbGrupoProduto();
                txtvalor.Text = "";

                cmdCopiarPreco.Enabled = false;
            }

            _alterado = false;
        }

        private bool ValidarValor()
        {
            if (decimal.Parse(txtvalor.Value.ToString()) == 0)
            {
                erpErro.SetError(txtvalor, "Você deve especificar um valor para o grupo de produto.");
                return true;
            }

            erpErro.SetError(txtvalor, "");
            return false;
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------
    }
}
